package study.itwill.jsp;

public class PageHandler {
	private int nowPage = 1;				// 현재 페이지
	private int totalArticleCount = 0;		// 전체 글 개수
	private int pageArticleCount = 10;		// 한 페이지에 보여질 글의 목록 수
	private int pageCount = 0;				// 전체 페이지 수
	private int pageGroupCount = 10;		// 한 그룹에 표시할 페이지번호 개수
	private int startPage = 0;				// 현재 페이징 그룹의 시작페이지 번호
	private int endPage = 0;				// 현재 페이징 그룹의 끝 페이지 번호
	private int startRec = 0;				// 검색 범위의 시작 위치
	private int lastGroupFirstPage = 0;		// 마지막 그룹의 첫 페이지
	
	/**
	 * "현재 페이지, 전체 데이터 수, 한 페이지당 목록 수, 페이지 그룹당 표시될 페이지의 수" 에 대하여
	 *  파라미티로 설정 할 수 있다.
	 * @param nowPage 현재 페이지
	 * @param totalArticleCount 전체 데이터 개수
	 * @param pageArticleCount 한 페이지당 목록 수
	 * @param pageGroupCount 페이지 그룹당 표시될 페이지의 수
	 */
	public PageHandler(int nowPage, int totalArticleCount, int pageArticleCount, int pageGroupCount) {
		this.nowPage = nowPage;
		this.totalArticleCount = totalArticleCount;
		this.pageArticleCount = pageArticleCount;
		this.pageGroupCount = pageGroupCount;
		initPage();
	}
	
	/**
	 * "현재 페이지, 전체 데이터 수"에 대하여 파라미터로 설정 할 수 있다.
	 * 나머지 값들은 멤버변수 선언시에 할당한 값들이 기본값으로 동작한다.
	 * @param nowPage 현재 페이지
	 * @param totalArticleCount 전체 데이터 수
	 */
	public PageHandler(int nowPage, int totalArticleCount) {
		this.nowPage = nowPage;
		this.totalArticleCount = totalArticleCount;
		initPage();
	}
	
	/**
	 * 페이지 계산식 구현
	 */
	public void initPage() {
		// 전체 페이지 수
		pageCount = ((totalArticleCount -1) / pageArticleCount) + 1;
		
		// 현재 페이지에 대한 오차 조절
		if (nowPage < 0) {
			nowPage = 1;
		}
		if (nowPage > pageCount) {
			nowPage = pageCount;
		}
		
		// 현재 페이징 그룹의 시작 페이지 번호
		startPage = ((nowPage - 1) / pageGroupCount) * pageGroupCount + 1;
		
		// 현재 페이지 그룹의 끝 페이지 번호
		endPage = (((startPage - 1) + pageGroupCount) / pageGroupCount) * pageGroupCount;
		
		// 끝 페이지 번호가 전체 페이지수를 초과하면 오차범위 조절
		if (endPage > pageCount) {
			endPage = pageCount;
		}
		
		// LIMIT절의 시작 위치 값
		startRec = (nowPage - 1) * pageArticleCount;
		
		// 마지막 그룹의 첫 페이지
		// --> 전체 페이지 수 / 한 그룹당 페이지 수 (몫만 취하므로...) + 1
		lastGroupFirstPage = (((pageCount - 1) / pageGroupCount) * pageGroupCount) + 1;
	}
	
	/*********************** getter 추가 ***********************/

	public int getNowPage() {
		return nowPage;
	}

	public int getTotalArticleCount() {
		return totalArticleCount;
	}

	public int getPageArticleCount() {
		return pageArticleCount;
	}

	public int getPageCount() {
		return pageCount;
	}

	public int getPageGroupCount() {
		return pageGroupCount;
	}

	public int getStartPage() {
		return startPage;
	}

	public int getEndPage() {
		return endPage;
	}

	public int getStartRec() {
		return startRec;
	}

	public int getLastGroupFirstPage() {
		return lastGroupFirstPage;
	}
}
